package gsutil

import (
	"fmt"
	"math/rand"
	"net"
	"strconv"
	"strings"
)

var IpUtil = ipUtil{}

type ipUtil struct {
}

// 从net.Addr中解析出ip和port。
func (x *ipUtil) ParseFromAddr(addr net.Addr) (ip string, port uint16) {
	res := strings.Split(addr.String(), ":")
	ip = res[0]
	_port, _ := strconv.Atoi(res[1])
	port = uint16(int16(_port))
	return ip, port
}

// 将ip字符串转换为int32类型, 如果ip 是 ipv6 则返回一个随机整数。
func (x *ipUtil) IpToInt(ip string) int32 {
	if ip == "" {
		return 0
	}

	res := strings.Split(ip, ".")
	if len(res) != 4 {
		return int32(rand.Intn(1 << 32))
	}

	a, _ := strconv.Atoi(res[0])
	b, _ := strconv.Atoi(res[1])
	c, _ := strconv.Atoi(res[2])
	d, _ := strconv.Atoi(res[3])
	return int32(a<<24 | b<<16 | c<<8 | d)
}

// 将int32类型的ip转换为字符串。
func (x *ipUtil) IntToIp(ip int32) string {
	val := int(ip)
	a := (val & 0xff000000) >> 24
	b := (val & 0x00ff0000) >> 16
	c := (val & 0x0000ff00) >> 8
	d := val & 0x000000ff
	return fmt.Sprintf("%d.%d.%d.%d", a, b, c, d)
}
